package gui;

import java.awt.Choice;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.ScrollPane;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.util.LinkedList;
import java.util.Scanner;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;

import mail.Mail;
import mail.MyModelEmail;
import tools.OptionReader;
import calendar.Event;
import contacts.Person;

/**
 * Erstellt ein JFrame, welches die neue Email schreiben Ansicht enthaelt
 * 
 * @author frederikroessler
 * 
 */
public class NewMailWindow extends JFrame {

	private static final long serialVersionUID = -2415576555283098663L;
	@SuppressWarnings("unused")
	private JPanel contentPane;

	// Sprachen (0 = deutsch; 1 = englisch; 2 = latein)
	int speak = 0;

	String[] von = { "Von:", "From:", "De:" };
	String[] an = { "An:", "To:", "Ad:" };
	String[] kopie = { "Kopie:", "Copy:", "Affici:" };
	String[] betreffs = { "Betreff:", "Subject:", "Subiectum:" };

	String[] title = { "Neue E-Mail", "New Mail", "Nova technica epistola" };

	String[] button = { "Senden", "Send", "Mittere" };

	// //////////

	// Textfelder
	private JTextField txt_an;
	private JTextField eingabean;
	private JTextField eingabekopie;
	private JTextField txt_kopie;
	private JTextField txtVon;
	private JTextArea texteingabefeld;
	private JTextField textField;
	@SuppressWarnings("rawtypes")
	private LinkedList stuff;
	private JTextField txtBetreff;
	private NewMailWindow nmw;
	private OptionReader or;
	private String[] windowColorsSeperated;
	private int r;
	private int g;
	private int b;
	private LinkedList<Person> llan = new LinkedList<Person>();
	private LinkedList<Person> llcopy = new LinkedList<Person>();

	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					NewMailWindow frame = new NewMailWindow();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Leerer Konstruktor, um neue Mail zu schreiben
	 */
	public NewMailWindow() {
		init(false);

	}

	/**
	 * Konstruktor um Mail String zu uebergeben
	 */
	public NewMailWindow(String mailTo) {
		init(false);
		eingabean.setText(mailTo);
		eingabean.setCaretPosition(0);

	}

	/**
	 * Konstruktor um auf Mail zu Antworten, hier werden Daten schon mitgegeben
	 * 
	 * @param mailTo
	 * @param betreff
	 * @param content
	 */
	public NewMailWindow(String mailTo, String betreff, String content) {

		init(false);
		eingabean.setText(mailTo);
		eingabean.setCaretPosition(0);
		texteingabefeld.setText("\n\n" + content);
		texteingabefeld.setCaretPosition(0);
		textField.setText("Re: " + betreff);
		textField.setCaretPosition(0);
	}

	/**
	 * Konstruktor fuer Forward Mail
	 * 
	 * @param betreff
	 * @param content
	 */
	public NewMailWindow(String betreff, String content) {

		init(false);
		texteingabefeld.setText(content);
		texteingabefeld.setCaretPosition(0);
		textField.setText("Fwd: " + betreff);
		textField.setCaretPosition(0);
	}

	/**
	 * Vermutlich nicht genutzt Hätte man ein Event könnte man hierdruch ein
	 * Neue Email Fenster mit den Daten erzeugen
	 * 
	 * @param e
	 */
	public NewMailWindow(Event e) {
		init(true);

		texteingabefeld.setText(e.getName() + "," + e.getStart() + ","
				+ e.getEnd() + "," + e.getOrt() + "," + e.getDescription()
				+ "," + e.getEventID());
		texteingabefeld.setCaretPosition(0);
		texteingabefeld.setDisabledTextColor(Color.black);
		texteingabefeld.setEnabled(false);
		texteingabefeld.setEditable(false);
		textField.setText(e.getName());
		textField.setCaretPosition(0);

	}

	/**
	 * init Funktion erstellt JFrame an sich
	 */
	public void init(final Boolean event) {
		
		or = new OptionReader();
		try {
			or.getOpionsFromFile();
		} catch (IOException e2) {

			e2.printStackTrace();
		}

		String windowColors = or.getColorSetting();
		windowColorsSeperated = windowColors.split(",");
		r = Integer.parseInt(windowColorsSeperated[0]);
		g = Integer.parseInt(windowColorsSeperated[1]);
		b = Integer.parseInt(windowColorsSeperated[2]);

		speak = Integer.parseInt(or.getLanguage());

		getContentPane().setBackground(new Color(r, g, b));
		nmw = this;
		setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		setSize(600, 700);
		getContentPane().setLayout(null);
		setTitle(title[speak]);

		// Definieren der TextFelder

		// Beschriftung An:
		txt_an = new JTextField();
		txt_an.setBackground(new Color(r, g, b));
		txt_an.setFont(new Font("Lucida Grande", Font.PLAIN, 13));
		txt_an.setBorder(null);
		txt_an.setEditable(false);
		txt_an.setText(an[speak]);
		txt_an.setBounds(53, 38, 33, 28);
		getContentPane().add(txt_an);
		txt_an.setColumns(10);

		// Eingabefeld fuer Empfaenger
		eingabean = new JTextField();
		eingabean.setBounds(98, 37, 421, 28);
		getContentPane().add(eingabean);
		eingabean.setColumns(10);

		// Eingabefeld fuer Kopie
		eingabekopie = new JTextField();
		eingabekopie.setBounds(98, 77, 421, 28);
		getContentPane().add(eingabekopie);
		eingabekopie.setColumns(10);

		// Button um Kontakte aus Adressbuch hinzuzufuegen
		JButton addcontactbutton = new JButton("+");
		addcontactbutton.setBounds(531, 38, 33, 28);

		// Button um Kontakte aus Adressbuch hinzuzufuegen
		JButton addcopybutton = new JButton("+");
		addcopybutton.setBounds(531, 78, 33, 28);

		// Zugehoeriger ActionListener oeffnet neues AddContactWindow in dem die
		// Auswahl der hinzufuegenden Kontakte moeglich ist
		addcontactbutton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				AddContactWindow namePanel = new AddContactWindow(nmw, false);
				namePanel.setVisible(true);

			}
		});

		addcopybutton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				AddContactWindow namePanel = new AddContactWindow(nmw, true);
				namePanel.setVisible(true);

			}
		});

		getContentPane().add(addcontactbutton);
		getContentPane().add(addcopybutton);

		// Beschriftung Kopie Feld
		txt_kopie = new JTextField();
		txt_kopie.setEditable(false);
		txt_kopie.setBackground(new Color(r, g, b));
		txt_kopie.setBorder(null);
		txt_kopie.setText(kopie[speak]);
		txt_kopie.setBounds(53, 77, 134, 28);
		getContentPane().add(txt_kopie);
		txt_kopie.setColumns(10);

		// Choice Dropdown Menue um Absender auszuwaehlen
		Choice vondropdown = new Choice();
		vondropdown.setVisible(false);
		vondropdown.setBackground(Color.LIGHT_GRAY);
		vondropdown.setForeground(Color.LIGHT_GRAY);
		vondropdown.setBounds(98, 151, 421, 26);
		getContentPane().add(vondropdown);

		// Absender beschriftungsfeld
		txtVon = new JTextField();
		txtVon.setVisible(false);
		txtVon.setEditable(false);
		txtVon.setBackground(new Color(r, g, b));
		txtVon.setBorder(null);
		txtVon.setText(von[speak]);
		txtVon.setBounds(53, 151, 134, 28);
		getContentPane().add(txtVon);
		txtVon.setColumns(10);

		// Textfeld fuer Email Inhalt

		ScrollPane texteingabescroll = new ScrollPane();
		texteingabescroll.setBounds(98, 232, 421, 387);
		texteingabefeld = new JTextArea();
		texteingabefeld.setBounds(98, 232, 421, 387);

		texteingabescroll.add(texteingabefeld);

		getContentPane().add(texteingabescroll);

		// Senden Button
		JButton btnSenden = new JButton(button[speak]);
		btnSenden.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {

				MyModelEmail mme = new MyModelEmail();

				String str = eingabean.getText();
				LinkedList<String> ll = new LinkedList<String>();
				String mailPattern = "[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})";
				Scanner scan = new Scanner(str);

				String cc = eingabekopie.getText();
				LinkedList<String> ccList = new LinkedList<String>();
				Scanner scanCc = new Scanner(cc);

				System.out.println("pattern erzeugt");
				ll.add(scan.findInLine(mailPattern));
				ccList.add(scanCc.findInLine(mailPattern));

				Mail mail = new Mail();

				// mail.setFrom(test.getEmail());
				mail.setBetreff(textField.getText());
				mail.setTo(ll);
				mail.setCc(ccList);
				mail.setText(texteingabefeld.getText());
				mme.sendMail(mail, event);
				dispose();
			}
		});
		btnSenden.setBounds(411, 631, 117, 29);
		getContentPane().add(btnSenden);

		textField = new JTextField();
		textField.setColumns(10);
		textField.setBounds(98, 117, 421, 28);
		getContentPane().add(textField);

		txtBetreff = new JTextField();
		txtBetreff.setText(betreffs[speak]);
		txtBetreff.setEditable(false);
		txtBetreff.setColumns(10);
		txtBetreff.setBorder(null);
		txtBetreff.setBackground(new Color(r, g, b));
		txtBetreff.setBounds(53, 117, 134, 28);
		getContentPane().add(txtBetreff);
	}

	@SuppressWarnings("rawtypes")
	public LinkedList getStuff() {
		return stuff;
	}

	@SuppressWarnings("rawtypes")
	public void setStuff(LinkedList stuff) {
		this.stuff = stuff;
	}

	public void setllan(LinkedList<Person> s) {
		this.llan = s;
	}

	public LinkedList<Person> getllan() {
		return this.llan;
	}

	public void setEingabeanfromll() {
		String hans = "";
		for (int i = 0; i < llan.size(); i++) {
			if (i != llan.size() - 1) {
				if (llan.get(i).getEmail().equals("") == false) {
					hans += llan.get(i).getEmail() + ", ";
				}
			} else {
				if (llan.get(i).getEmail().equals("") == false) {
					hans += llan.get(i).getEmail();
				}
			}
		}
		this.eingabean.setText(hans);
	}

	public void setEingabekopiefromll() {
		String s = "";
		for (int i = 0; i < llcopy.size(); i++) {
			if (i != llcopy.size() - 1) {
				if (llcopy.get(i).getEmail().equals("") == false) {
					s += llcopy.get(i).getEmail() + ", ";
				}
			} else {
				if (llcopy.get(i).getEmail().equals("") == false) {
					s += llcopy.get(i).getEmail();
				}
			}
		}
		this.eingabekopie.setText(s);
	}

	public void setllcopy(LinkedList<Person> s) {
		this.llcopy = s;
	}

	public LinkedList<Person> getllcopy() {
		return this.llcopy;
	}
}
